SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[spCalcularPuntaje1]

-- Parametros
@op INT,
@convocatoria INT,
@agente INT,
@nivel INT,
@ciclo INT

AS
SET NOCOUNT ON
-- Variables Locales
DECLARE @tempFormula VARCHAR(100)
DECLARE @concepto INT
DECLARE @inscripcion INT
DECLARE @error INT

BEGIN TRANSACTION

-- OP define que procedimiento debe correr
-- OP = 1 -- TODOS los puntajes
-- OP = 2 -- RECALCULAR en Si
-- OP = 3 -- AGENTE

-- TODOS los Puntajes
IF @op = 1 BEGIN

	DECLARE X CURSOR FOR

	SELECT CP.FormulaPuntaje, CP.IDConcepto, IC.IdInscripcionConvocatoria
	FROM tb_ConceptosDePuntaje CP INNER JOIN tb_TiposDeConvocatorias TC ON CP.TipoConvocatoria = TC.IdTipoConvocatoria 
	INNER JOIN tb_Convocatorias C ON C.TipoConvocatoria = TC.IdTipoConvocatoria
	INNER JOIN tb_InscripcionesConvocatorias IC ON IC.Convocatoria = C.IdConvocatoria
	WHERE C.IdConvocatoria = @convocatoria AND CP.FormulaPuntaje IS NOT NULL

	OPEN X

	FETCH NEXT FROM X INTO @tempFormula, @concepto, @inscripcion

	WHILE @@FETCH_STATUS = 0 BEGIN
	
		DECLARE @temp VARCHAR(1000)
		SELECT @temp = 'DECLARE @puntaje FLOAT ' + char(10) + 'SET @puntaje = 0 ' + char(10)
		SELECT @temp = @temp + 'EXEC ' +@tempFormula + ' ' + convert(varchar, @inscripcion) + ', @puntaje output, 0' + char(10)
		SELECT @temp = @temp + 'INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje) VALUES(' + convert(varchar, @inscripcion) + ', ' + convert(varchar, @concepto) +', ISNULL(@puntaje, 0))'
		PRINT(@temp)
		EXEC(@temp)

		IF @@error <> 0 BEGIN
			SELECT @error = @@error
			GOTO Salir
		END

		FETCH NEXT FROM X INTO @tempFormula, @Concepto, @inscripcion
	END

	CLOSE X
	DEALLOCATE X

	--  COMPLETA EL CONCEPTO PUNTAJE FINAL
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 468, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	WHERE IC.Convocatoria = @convocatoria
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

	--  COMPLETA EL CONCEPTO PUNTAJE ACRECENTAMINETO
	-- Falta cheuqear como lo calcula
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 469, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	WHERE IC.Convocatoria = @convocatoria AND CI.Concepto <> 468
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

END

-- Los que tienen RECALCULAR en Si
IF @op = 2 BEGIN

	DECLARE X CURSOR FOR

	SELECT CP.FormulaPuntaje, CP.IdConcepto, IC.IdInscripcionConvocatoria
	FROM tb_ConceptosDePuntaje CP INNER JOIN tb_TiposDeConvocatorias TC ON CP.TipoConvocatoria = TC.IdTipoConvocatoria 
	INNER JOIN tb_Convocatorias C ON C.TipoConvocatoria = TC.IdTipoConvocatoria
	INNER JOIN tb_InscripcionesConvocatorias IC ON IC.Convocatoria = C.IdConvocatoria
	WHERE C.IdConvocatoria = @convocatoria AND CP.FormulaPuntaje IS NOT NULL AND IC.NecesitaRecalcular = 'S'

	OPEN X

	FETCH NEXT FROM X INTO @tempFormula, @concepto, @inscripcion

	WHILE @@FETCH_STATUS = 0 BEGIN
	
		DECLARE @temp2 VARCHAR(1000)
		SELECT @temp2 = 'DECLARE @puntaje FLOAT ' + char(10) + 'SET @puntaje = 0 ' + char(10)
		SELECT @temp2 = @temp2 + 'EXEC ' +@tempFormula + ' ' + convert(varchar, @inscripcion) + ', @puntaje output, 0' + char(10)
		SELECT @temp2 = @temp2 + 'INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje) VALUES(' + convert(varchar, @inscripcion) + ', ' + convert(varchar, @concepto) +', ISNULL(@puntaje, 0))'
		EXEC(@temp2)

		IF @@error <> 0 BEGIN
			SELECT @error = @@error
			GOTO Salir
		END

		FETCH NEXT FROM X INTO @tempFormula, @Concepto, @inscripcion
	END

	CLOSE X
	DEALLOCATE X

	--  COMPLETA EL CONCEPTO PUNTAJE FINAL
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 468, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	WHERE IC.Convocatoria = @convocatoria
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

	--  COMPLETA EL CONCEPTO PUNTAJE ACRECENTAMINETO
	-- Falta cheuqear como lo calcula
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 469, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	WHERE IC.Convocatoria = @convocatoria AND CI.Concepto <> 468
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

END

-- Los puntajes de un AGENTE
IF @op = 3 BEGIN

	IF EXISTS(SELECT * FROM tb_CalificacionesDeInscripcion CI INNER JOIN tb_InscripcionesConvocatorias I ON I.IdInscripcionConvocatoria = CI.Inscripcion INNER JOIN tb_Convocatorias C ON C.IdConvocatoria = I.Convocatoria INNER JOIN tb_Agentes A ON A.IdAgente = I.Agente WHERE C.IdConvocatoria = @convocatoria AND A.Documento = @agente AND I.Nivel = @nivel AND I.Ciclo = @ciclo) BEGIN
		
		DELETE CI
		FROM tb_CalificacionesDeInscripcion CI 
		INNER JOIN tb_InscripcionesConvocatorias I ON I.IdInscripcionConvocatoria = CI.Inscripcion
		INNER JOIN tb_Convocatorias C ON C.IdConvocatoria = I.Convocatoria
		INNER JOIN tb_Agentes A ON A.IdAgente = I.Agente
		WHERE C.IdConvocatoria = @convocatoria AND A.Documento = @agente AND
		I.Nivel = @nivel AND I.Ciclo = @ciclo

	END

	DECLARE X CURSOR FOR

	SELECT CP.FormulaPuntaje, CP.IDConcepto, IC.IdInscripcionConvocatoria
	FROM tb_ConceptosDePuntaje CP INNER JOIN tb_TiposDeConvocatorias TC ON CP.TipoConvocatoria = TC.IdTipoConvocatoria 
	INNER JOIN tb_Convocatorias C ON C.TipoConvocatoria = TC.IdTipoConvocatoria
	INNER JOIN tb_InscripcionesConvocatorias IC ON IC.Convocatoria = C.IdConvocatoria
	INNER JOIN tb_Agentes A ON A.Idagente = IC.Agente
	WHERE C.IdConvocatoria = @convocatoria AND CP.FormulaPuntaje IS NOT NULL AND A.Documento = @agente
	AND IC.Nivel = @nivel AND IC.Ciclo = @ciclo
	AND IC.IdInscripcionConvocatoria = (SELECT MIN(IdInscripcionConvocatoria) FROM tb_InscripcionesConvocatorias WHERE Agente = IC.Agente and convocatoria = IC.Convocatoria and cargogenerico = IC.Cargogenerico AND asignaturagenerica = IC.asignaturagenerica AND IC.Nivel = @nivel AND IC.Ciclo = @ciclo)

	OPEN X

	FETCH NEXT FROM X INTO @tempFormula, @concepto, @inscripcion

	WHILE @@FETCH_STATUS = 0 BEGIN
		
		DECLARE @temp3 VARCHAR(8000)
		SELECT @temp3 = 'DECLARE @puntaje FLOAT ' + char(10) + 'SET @puntaje = 0 ' + char(10)
		SELECT @temp3 = @temp3 + 'EXEC ' +@tempFormula + ' ' + convert(varchar, @inscripcion) + ', @puntaje output, 0' + char(10)
		
		SELECT @temp3 = @temp3 + 'INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje) VALUES(' + convert(varchar, @inscripcion) + ', ' + convert(varchar, @concepto) +', ISNULL(@puntaje, -1))' --+  char(10)+ 'print ''puntaje que guardé  '' +  cast (@puntaje as varchar)'
		
		
		EXEC(@temp3)
		PRINT(@temp3)
		
		--print ' Esto es lo que ejecutó......' + cast (@temp3 as varchar)
		--print @temp3

		IF @@error <> 0 BEGIN
			DECLARE @temp12 VARCHAR(100)
			SET @temp12 = 'PROCEDIMIENTO ' +@tempFormula
			RAISERROR(@temp12, 16, 1)
			SELECT @error = @@error
			PRINT('ERROR EN EL PROCEDIMIENTO ' + @tempFormula)
			GOTO Salir
		END
		--PRINT('PROCEDIMIENTO OK '+@tempFormula)

		FETCH NEXT FROM X INTO @tempFormula, @Concepto, @inscripcion
	END

	CLOSE X
	DEALLOCATE X

	--  COMPLETA EL CONCEPTO PUNTAJE FINAL
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 234, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	INNER JOIN tb_Agentes A ON A.idAgente = IC.Agente
	WHERE IC.Convocatoria = @convocatoria AND A.Documento = @agente AND CI.Concepto NOT IN(245, 246, 247, 248, 234, 235, 224, 473)
	AND IC.Nivel = @nivel AND IC.Ciclo = @ciclo
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

	--  COMPLETA EL CONCEPTO PUNTAJE ACRECENTAMINETO
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 235, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	INNER JOIN tb_Agentes A ON A.IdAgente = IC.Agente	
	WHERE IC.Convocatoria = @convocatoria AND A.Documento = @agente AND CI.Concepto NOT IN (245, 246, 247, 248, 234, 235, 191, 224, 473)
	AND IC.Nivel = @nivel AND IC.Ciclo = @ciclo
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

	--  COMPLETA EL CONCEPTO PUNTAJE MOD ARTISTICA
	INSERT INTO tb_CalificacionesDeInscripcion(Inscripcion, Concepto, Puntaje)
	SELECT CI.Inscripcion, 473, SUM(CI.Puntaje)
	FROM tb_InscripcionesConvocatorias IC INNER JOIN tb_CalificacionesDeInscripcion CI ON IC.IdInscripcionConvocatoria = CI.Inscripcion
	INNER JOIN tb_Agentes A ON A.IdAgente = IC.Agente	
	WHERE IC.Convocatoria = @convocatoria AND A.Documento = @agente AND CI.Concepto NOT IN (245, 246, 247, 248, 234, 235, 235, 473)
	AND IC.Nivel = @nivel AND IC.Ciclo = @ciclo
	GROUP BY CI.Inscripcion

	IF @@error <> 0 BEGIN
		SELECT @error = @@error
		GOTO Salir
	END

END

Salir:
IF @error <> 0 BEGIN
	--CLOSE X
	--DEALLOCATE X
	--DECLARE @temp1 VARCHAR(100)
	--SET @temp1 = 'ERROR EN EL PROC ' + @tempFormula  
	--RAISERROR(@temp1, 16, 1)
	PRINT('ROLLBACK')
	ROLLBACK TRANSACTION
END
ELSE BEGIN
	PRINT('COMMIT')
	COMMIT TRANSACTION
END
GO
